//
//  function.c
//  通讯录的实现2.0
//
//  Created by 卜绎皓 on 2022/4/23.
//

#include "function.h"
 
int i = 0;                                                                                        //全局变量i
//排序里面的比较函数
int compare(const void* e1, const void* e2)
{
    return strcmp(((message*)e1)->name, ((message*)e2)->name);
}
 
//增加通讯录容量函数
void capcityadd(content* ab)
{
    if (ab->sz == ab->capcity)
    {
        message* tmp = (message*)realloc(ab->data, (ab->capcity + 2) * sizeof(message));            //注意这里的结构体，不要引错了
        if (tmp != NULL)
        {
            ab->data = tmp;
            ab->capcity += 2;
            printf("增加容量成功\n");
        }
        else
        {
            printf("addcontact::%s\n", strerror(errno));
        }
    }
}
 
//查找姓名函数
int seekname(char* name, content* ab)
{
    for (i = 0; i < ab->sz; i++)
    {
        if ((strcmp(name, ab->data[i].name)) == 0)
            return i;
    }
    return -1;
}
 
//初始化通讯录函数
void Initcontact(content* ab)
{
    assert(ab);
    ab->sz = 0;
    ab->capcity = FRINUM;
    message* tmp = (message*)malloc(FRINUM*sizeof(message));
    //判断tmp是否为空指针
    if (tmp == NULL)
    {
        printf("Initcontact::%s\n",strerror(errno));
        return;
    }
    ab->data = tmp;                                                                            //动态的为指针ab开辟内存
    return;
}
 
//增加联系人函数
void addcontact(content* ab)
{
    assert(ab);
    capcityadd(ab);                                                                                //增加通讯录的容量
    printf("请输入联系人的姓名->");
    scanf("%s",ab->data[ab->sz].name);
    printf("请输入联系人的性别->");
    scanf("%s",ab->data[ab->sz].sex);
    printf("请输入联系人的年龄->");
    scanf("%d",&(ab->data[ab->sz].age));
    printf("请输入联系人的电话->");
    scanf("%s",ab->data[ab->sz].number);
    printf("请输入联系人的住址->");
    scanf("%s",ab->data[ab->sz].address);
    printf("增加联系人成功\n");
    ab->sz++;
}
 
//删除联系人函数
void delcontact(content* ab)
{
    assert(ab);
    char name[MIN_NAME] = {0};
    printf("请输入要删除联系人的姓名->");
    scanf("%s", name);
    int ret = seekname(name,ab);                        //查找姓名函数
    if (ret == -1)
        printf("没有该联系人\n");
    else
    {
        for (i = ret; i < ab->sz; i++)
        {
            ab->data[i] = ab->data[i + 1];
        }
        printf("删除指定联系人成功\n");
        ab->sz--;                                        //注意这一一定要执行这一步，删除一个联系人以后通讯录中有效个数就应该减少1
    }
    return;
}
 
//寻找联系人函数
void seekcontact(content* ab)
{
    assert(ab);
    char name[MIN_NAME] = { 0 };
    printf("请输入要查找联系人的姓名->");
    scanf("%s", name);
    int ret = seekname(name, ab);                        //查找姓名函数
    if (ret == -1)
    {
        printf("没有该联系人\n");
        return;
    }
    else
    {
        printf("%-7s\t%-5s\t%-5s\t%-15s\t%-20s\n", "姓名", "性别", "年龄", "电话", "住址");
        printf("%-7s\t%-5s\t%-5d\t%-15s\t%-20s\n",
            ab->data[ret].name, ab->data[ret].sex, ab->data[ret].age, ab->data[ret].number, ab->data[ret].address);
    }
    return;
}
 
//修改联系人信息函数
void modcontact(content* ab)
{
    assert(ab);
    char name[MIN_NAME] = { 0 };
    printf("请输入要查找联系人的姓名->");
    scanf("%s", name);
    int ret = seekname(name, ab);                        //查找姓名函数
    if (ret == -1)
    {
        printf("没有该联系人\n");
        return;
    }
    else
    {
        printf("%-7s\t%-5s\t%-5s\t%-15s\t%-20s\n", "姓名", "性别", "年龄", "电话", "住址");
        printf("%-7s\t%-5s\t%-5d\t%-15s\t%-20s\n",
            ab->data[ret].name, ab->data[ret].sex, ab->data[ret].age, ab->data[ret].number, ab->data[ret].address);
    }
    printf("请输入修改信息\n");
    printf("请输入联系人的姓名->");
    scanf("%s", ab->data[ret].name);
    printf("请输入联系人的性别->");
    scanf("%s", ab->data[ret].sex);
    printf("请输入联系人的年龄->");
    scanf("%d", &(ab->data[ret].age));
    printf("请输入联系人的电话->");
    scanf("%s", ab->data[ret].number);
    printf("请输入联系人的住址->");
    scanf("%s", ab->data[ret].address);
    printf("修改成功\n");
    return;
}
 
//清空联系人信息函数
void emptycontact(content* ab)
{
    assert(ab);
    printf("请确认是否要清空通讯录(Y/N):");
    char str = 0;
    while ((str = getchar()) != '\n')
    {
        ;
    }
    scanf("%c", &str);
    if (str == 'Y')
    {
        ab->data = 0;
        ab->capcity = 0;
        ab->sz = 0;
        printf("全部清除成功\n");
    }
    return;
}
 
//展示联系人函数
void showcontact(content* ab)
{
    //姓名、性别、年龄、电话、住址
    assert(ab);
    printf("%-7s\t%-5s\t%-5s\t%-15s\t%-20s\n","姓名","性别", "年龄", "电话", "住址");
    for (i = 0; i < ab->sz; i++)
    {
        printf("%-7s\t%-5s\t%-5d\t%-15s\t%-20s\n",
            ab->data[i].name, ab->data[i].sex, ab->data[i].age, ab->data[i].number, ab->data[i].address);
    }
    return;
}
 
//排序联系人信息函数
void sortcontact(content* ab)
{
    assert(ab);
    qsort(ab->data,ab->sz,sizeof(ab->data[0]),compare);
    printf("%-7s\t%-5s\t%-5s\t%-15s\t%-20s\n", "姓名", "性别", "年龄", "电话", "住址");
    for (i = 0; i < ab->sz; i++)
    {
        printf("%-7s\t%-5s\t%-5d\t%-15s\t%-20s\n",
            ab->data[i].name, ab->data[i].sex, ab->data[i].age, ab->data[i].number, ab->data[i].address);
    }
    return;
}

//保存通讯录信息到文件
void SaveContact(content* pc)
{
    FILE* pf = fopen("contact.dat", "wb");
    if (pf == NULL)
    {
        perror("open file for writing");
        return;
    }
    //写文件
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        fwrite(pc->data + i, sizeof(message), 1, pf);
    }
    //关闭文件
    fclose(pf);
    pf = NULL;
}


//加载文件中的信息到通讯录
void LoadContact(content** ppc)
{
    FILE* pf = fopen("contact.dat", "rb");
    if (pf == NULL)
    {
        perror("open file for reading");
        return;
    }
    //读文件
    message data = { 0 };
    while (fread(&data, sizeof(message), 1, pf))
    {
        seekcontact(*ppc);
        (*ppc)->data[(*ppc)->sz] = data;
        (*ppc)->sz++;
    }
    //关闭文件
    fclose(pf);
    pf = NULL;
}
